原文連結:Adding ABAP logic
在航班轉機的應用程式中,包含了出發/抵達的機場、國家與城市。如下圖,期望上會希望使用者只需要輸入機場代碼就能連結相關資料,在ABAP RESTful API 中可以使用Determination來進行綁定。
首先,要在BO的行為定義中定義determination。以本例而言,determination名為getCities
,只要當BO被儲存、AirportFromID
和 AirportToID
任一欄位變更時就會呼叫。一樣可以在行為定義時,對決定按下ctrl+1並雙擊,建立對應程式碼在行為實體中。
"在行為定義中"
determination GetCities
on save { field AirportFromID, Airport ToID; }
"在行為實例中"
CLASS 1cl_handler DEFINITION INHERITING FROM cl_abap_behavior_handler.
PRIVATE SECTION.
METHODS:
getCities FOR DETERMINE ON SAVE IMPORTING keys FOR Connection~GetCities.
ENDCLASS.
當系統觸發determination,將觸發相關實體,輸入參數keys
包含了被變更的資料,並如驗證同樣使用EML讀取資料,然而,在determination中需要使用UPDATE
關鍵字來更新資料。
註:範例中的loop是為了簡化語法,可能導致SELECT
的效能問題,實務上應盡量避免。
READ ENTITIES OF zs4d400_r_connection IN LOCAL MODE
ENTITY Connection
FIELDS (AirportFromID AirportToID)
WITH CORRESPONDING #(keys )
RESULT DATA (connections).
首先,一樣讀入使用者的輸入值,需要讀入的有 AirportFromID
與AirportToID
欄位,並由此自動完成城市及國家等資訊。
LOOP AT connections INTO DATA (connection).
"讀入對應的出發地資訊"
SELECT SINGLE
FROM /dmo/i_airport
FIELDS City, CountryCode
WHERE AirportID = @connection-AirportFromID
INTO (@connection-CityFrom, @connection-CountryFrom ).
"讀入對應的抵達地資訊"
SELECT SINGLE
FROM /dmo/i_airport
FIELDS City, CountryCode
WHERE AirportID = @connection-Airport ToID
INTO (@connection-CityTo, @connection-CountryTo ).
"將資料放入指定表格中"
MODIFY connections FROM connection.
ENDLOOP.
在此使用CDS視圖/dmo/i_airport
來搜尋國家與城市,並將資料透過INTO
來指定放入的structure欄位,並使用MODIFY
來回傳到 internal tableconnections
中。
DATA connections_upd TYPE TABLE FOR UPDATE zs4d400_r_connections.
connections_upd = CORRESPONDING #( connections ).
READ ENTITIES
會回傳具有FOR READ RESULT
型別的internal table作為回傳結果。如果要變更buffer中的資料,要使用MODIFY ENTITIES
關鍵字,並將資料存入具有FOR UPDATE
型別的internal table 中。雖然兩種形別的資料欄位相同,但在FOR UPDATE
型別的表格中有一個名為%control
的附加structure,包含了系統管理員的相關欄位。
注意,不能使用MODIFY ENTITIES
來直接傳遞connections
表格,因此在變更資料前,需要複製資料到適當型態的表格connections_upd
中。
MODIFY ENTITIES OF zs4d400_r_connection IN LOCAL MODE
ENTITY Connection
UPDATE
FIELDS (City From Country From City To Country To )
WITH connections_upd
REPORTED DATA (reported_records).
reported-connection = CORRESPONDING #(reported_records-connection ).
接著使用MODIFY ENTITIES
在determination中更新資料,在FIELDS
後指定欄位,並且使用WITH
放入internal tableconnections_upd
中,該表格需要有正確的資料型別,如範例中使用的就是TYPE TABLE FOR UPDATE zsd4d400_r_connection
。
MODIFY ENTITIES
關鍵字也可用來回傳用REPORTED
接收到的錯誤訊息,可以透過複製internal table的內容到determination方法的REPORTED
structure,以將這些訊息傳到BO中。
明天來介紹如何改善程式的使用者體驗!